本文參考此篇學習如何部署程式(在這邊是以 Java 為範例)到 kubernetes 叢集。
該篇主要有三支程式:
jar 檔來部署jar 檔假設電腦都已安裝好環境。
先把檔案從 github 拉下來。
jar 檔查看資料夾下的檔案。
ls
README.md        kubernetes       productcatalogue shopfront        stockmanager
cd shopfront/
ls
# 每個檔案中都有一個 Dockerfile
Dockerfile pom.xml    src
在 Dockerfile 裡已先定義好要將 target/shopfront-0.0.1-SNAPSHOT.jar 檔複製一份出來,但目前在資料夾內沒有這個檔案,故我們要先個別去做 mvn clean install 這個動作來產生。
FROM openjdk:8-jre
ADD target/shopfront-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8010
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
在三個資料夾下個別執行以下動作產生 target/ 中的 jar 檔,使用 -Dmaven.test.skip 略過測試。
mvn clean install -Dmaven.test.skip
在個別資料夾下建立 image。
cd shopfront
docker build -t shopfront:latest .
cd productcatalogue
docker build -t productcatalogue:latest .
cd stockmanager
docker build -t stockmanager:latest .
查看建立好的 images。
docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
stockmanager                  latest    c74378106577   3 minutes ago   317MB
productcatalogue              latest    bf5ed57fcf7b   3 minutes ago   291MB
shopfront                     latest    cf4910127682   3 minutes ago   320MB
gcr.io/k8s-minikube/kicbase   v0.0.40   c6cc01e60919   2 months ago    1.19GB
這邊我使用 local 的 images、不將 images 上傳至 DockerHub。
minikube image load shopfront productcatalogue stockmanager
進入 minikube 在查看 images。
minikube ssh
docker@minikube:~$ docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED          SIZE
stockmanager                                         latest    c74378106577   22 minutes ago   317MB
shopfront                                            latest    cf4910127682   22 minutes ago   320MB
productcatalogue                                     latest    bf5ed57fcf7b   22 minutes ago   291MB
在 kubernetes 資料夾下有三個 YAML。
cd kubernetes/
productcatalogue-service.yaml shopfront-service.yaml        stockmanager-service.yaml
shopfront-service.yaml 使用 --- 分隔不同資源,上半部為 service、下半部為 deployment。
shopfront:latest、productcatalogue:latest、stockmanager:latest,以及新增 imagePullPolicy 屬性,下面只貼 shopfront 的 yaml。---
apiVersion: v1
kind: Service
metadata:
  name: shopfront
  labels:
    app: shopfront
spec:
  type: NodePort
  selector:
    app: shopfront # 這邊 service 要使用在哪些 pod
  ports:
  - protocol: TCP
    port: 8010 # service 與 node port 一樣設定為 8010
    name: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: shopfront
spec:
  selector:
    matchLabels:
      app: shopfront
  replicas: 1
  template:
    metadata:
      labels:
        app: shopfront
    spec:
      containers:
      - name: shopfront
        image: shopfront:latest # 要修改 image,這邊等等會使用 local image
        imagePullPolicy: Never # 告訴 k8s 不要從 dockerhub 拉 image
        ports:
        - containerPort: 8010 # 該容器的 port
        livenessProbe:
          httpGet:
            path: /health
            port: 8010
          initialDelaySeconds: 30
          timeoutSeconds: 1
修改好內容後建立,這邊我省略其他兩個指令。
kubectl apply -f shopfront-service.yaml
service/shopfront created
deployment.apps/shopfront created
查看建立的 service、deployment 以及底下一個 pod。
kubectl get svc,po,deploy
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          9d
service/shopfront    NodePort    10.110.187.91   <none>        8010:32299/TCP   70s
NAME                            READY   STATUS         RESTARTS   AGE
pod/shopfront-76d58c669-b9bcx   0/1     ErrImagePull   0          70s
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/shopfront   0/1     1            0           70s 
記得重複執行其他兩個檔案。這邊請注意在
stockmanager-service.yaml中修改時,裡面第 22 行與第 23 行有重複兩個spec:,記得刪除其中一個!
透過 minikube service 連到 service,開啟瀏覽器觀看 127.0.0.1:51459。
minikube service shopfront
|-----------|-----------|-------------|---------------------------|
| NAMESPACE |   NAME    | TARGET PORT |            URL            |
|-----------|-----------|-------------|---------------------------|
| default   | shopfront | http/8010   | http://192.168.49.2:32299 |
|-----------|-----------|-------------|---------------------------|
🏃  Starting tunnel for service shopfront.
|-----------|-----------|-------------|------------------------|
| NAMESPACE |   NAME    | TARGET PORT |          URL           |
|-----------|-----------|-------------|------------------------|
| default   | shopfront |             | http://127.0.0.1:51459 |
|-----------|-----------|-------------|------------------------|
🎉  Opening service default/shopfront in default browser...
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
瀏覽器輸入的 url 後面要接 /products。
minikube service productcatalogue
瀏覽器輸入的 url 後面要接 /stocks。
minikube service stockmanager
這次主要藉由參考該範例來了解到實際程式的部署過程,實際上目前的流程可以透過 Jenkins pipeline 來幫我們自動做完。相比前面再講很多 k8s 的物件,這類的實際應用會比較有趣XD。